package com.teamwork_backend.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.teamwork_backend.entity.Positions;
import com.teamwork_backend.entity.UserInfo;
import com.teamwork_backend.mapper.UserInfoDao;
import com.teamwork_backend.service.PositionsService;
import com.teamwork_backend.service.UserInfoService;
import com.teamwork_backend.utils.DataResult;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author windy
 * @since 2021-04-25
 */
@RestController
@RequestMapping("/user-info")
@Api(value = "UserInfoController", tags = {"个人/专家用户信息接口"})
public class UserInfoController {
    // 注入数据模型
    @Autowired
    private UserInfoService userInfoService;

    /**
     GET：当参数只有一个或者两个的时候，我们用Get，只是为了页面的渲染，刚进入的
     POST：当参数非常多，传一个请求体（java对象），然后前端用到什么参数填什么参数
     */
    /** 获取个人/专家用户信息 */
    @GetMapping("getInfo") // Get方法
    @ApiOperation(value = "获取个人/专家用户信息", notes = "获取个人/专家用户信息", httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "userid", value = "用户唯一标示", required = true, dataType = "string")})
    // GET请求会直接在函数括号里面跟参数，并且写在外面写@ApiImplicitParams注解
    // POST请求需要写@RequestBody请求体，通过参数对象来传参数，一定要注意否则前端Vue+axios接收不了参数
    public DataResult getInfo(String userid) {
        // 定义查询字段
        // wrapper用法见https://blog.csdn.net/m0_37034294/article/details/82917234
        QueryWrapper<UserInfo> wrapper = new QueryWrapper<>();
        wrapper.select().eq("userid", userid);
        // 会自动生成 SELECT * FROM user_info WHERE userid = userid
        // 定义数据接收对象
        UserInfo userInfo = userInfoService.getOne(wrapper);
        // 如果是列表 List<UserInfo> userInfos = userInfoService.list(wrapper);
        // 判断是否存在该用户信息
        if(userInfo != null) {
            // 成功返回数据
            return DataResult.finished().data("data", userInfo).message("用户信息查找成功！");
        } else {
            // 失败返回数据
            return DataResult.failed().message("用户信息不存在！");
        }
    }

    // 在mapper的Dao自定义了SQL联表语句需要调用userInfoDao
    // SQL语句见../mapper/UserInfoDao.java
    // 有需要联表操作就定义，不需要就不用
    @Resource
    private UserInfoDao userInfoDao;

    /** 根据用户账户获取个人/专家用户信息 */
    @GetMapping("getInfoByAccount") // Get方法
    @ApiOperation(value = "根据用户账户获取个人/专家用户信息", notes = "根据用户账户获取个人/专家用户信息", httpMethod = "GET")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "account", value = "用户账户", required = true, dataType = "string")})
    public DataResult getinfo(String account) {
        // 定义数据接收对象，这里调用了UserInfoDao.java层中的自定义SQL语句方法
        UserInfo userInfo = userInfoDao.getUserInfoByAccount(account);
        // 判断是否存在该用户信息
        if(userInfo != null) {
            // 成功返回数据
            return DataResult.finished().data("data", userInfo).message("用户信息查找成功！");
        } else {
            // 失败返回数据
            return DataResult.failed().message("用户信息不存在！");
        }
    }

    /** 增加个人/专家用户信息
     * 注意：在http://localhost:8081/doc.html中测试时候
     * 主键userinfoid为空（会自动生成），生日格式为"2021-01-22"（中间为短横线）
     */
    @PostMapping("addtInfo") // Post方法
    @ApiOperation(value = "增加个人/专家用户信息", notes = "增加个人/专家用户信息", httpMethod = "POST")
    // GET请求会直接在函数括号里面跟参数，并且写在外面写@ApiImplicitParams注解
    // POST请求需要写@RequestBody请求体，通过参数对象来传参数，一定要注意否则前端Vue+axios接收不了参数
    public DataResult addtInfo(
            @ApiParam(name = "userInfo", value = "个人/专家用户信息对象", required = true)
            // 这个就是一个请求体
            @RequestBody UserInfo userInfo)
    {
        // 设置添加成功的返回标志
        boolean flag = userInfoService.save(userInfo);
        if (flag) {
            // 成功返回数据
            return DataResult.finished().message("用户信息添加成功！");
        } else {
            // 失败返回数据
            return DataResult.failed().message("用户信息添加失败！");
        }
    }

    /** 更新个人/专家用户信息
     * 注意：在http://localhost:8081/doc.html中测试时候
     * 主键userinfoid为需要更新的用户的，生日格式为"2021-01-22"（中间为短横线）
     */
    @PostMapping("updatetInfo") // Post方法
    @ApiOperation(value = "更新个人/专家用户信息", notes = "更新个人/专家用户信息", httpMethod = "POST")
    public DataResult updatetInfo(
            @ApiParam(name = "userInfo", value = "个人/专家用户信息对象", required = true)
            @RequestBody UserInfo userInfo)
    {
        // 设置添加成功的返回标志
        boolean flag = userInfoService.updateById(userInfo);
        if (flag) {
            // 成功返回数据
            return DataResult.finished().message("用户信息更新成功！");
        } else {
            // 失败返回数据
            return DataResult.failed().message("用户信息更新失败！");
        }
    }
    @Autowired
    private PositionsService positionsService;

    /** 获取所有职位信息列表 */
    @GetMapping("getAllPositions") // Get方法
    @ApiOperation(value = "获取所有职位信息列表", notes = "获取所有职位信息列表", httpMethod = "GET")
    public DataResult getAllPositions() {
        QueryWrapper<Positions> wrapper = new QueryWrapper<>();
        wrapper.select();
        List<Positions> positions = positionsService.list(wrapper);
        if(positions != null) {
            // 成功返回数据
            return DataResult.finished().data("data", positions).message("信息查找成功！");
        } else {
            // 失败返回数据
            return DataResult.failed().message("信息不存在！");
        }
    }
}